perm filename EPAR3G.2[EAL,HE] blob sn#708033 filedate 1983-04-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor: Aux routines for parsing }
C00005 00003	(* aux function for motion clauses: thenCode *)
C00007 00004	(* waitParse *)
C00009 00005	(* armMagicParse *)
C00013 ENDMK
C⊗;
{$NOMAIN	Editor: Aux routines for parsing }

%include eparse.hdr;

{ Externally defined routines from elsewhere: }

	(* From ALLOC *)
function newNode: nodep;					external;
function newStatement: statementp;				external;

	(* From EROOT:  Inter-overlay calls *)
function e3gExprParse: nodep;					external;
procedure e3gGetArgs(opn: nodep);				external;

	(* From EAUX1A *)
function makeNVar(vartype: datatypes; vid: identp): varidefp;	external;

	(* From EAUX1B *)
function checkArg(n: nodep; d: datatypes): nodep;		external;
procedure appendEnd(s,so: statementp);				external;

	(* From EAUX1C *)
procedure errprnt;						external;
function evalOrder(what,last: nodep; pcons: boolean): nodep;	external;
procedure relExpr(n: nodep);					external;

	(* From EAUX2A *)
procedure makeNewVar(newvar: varidefp);				external;

	(* From ETOKEN *)
procedure getToken;						external;
procedure getDelim(char: ascii);				external;

	(* From PP *)
procedure ppLine; 						external;
procedure ppOutNow; 						external;
procedure ppChar(ch: ascii); 					external;
procedure pp5(ch: c5str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure pp10L(ch: cstring; length: integer);			external;
procedure pp20(ch: c20str; length: integer); 			external;
procedure pp20L(ch: c20str; length: integer); 			external;
procedure ppInt(i: integer); 					external;
procedure ppReal(r: real); 					external;
procedure ppStrng(length: integer; s: strngp); 			external;
procedure ppDtype(d: datatypes);				external;
procedure ppDelChar; 						external;


procedure ePar3gGet; external;
procedure ePar3gGet;  begin end;

(* aux function for motion clauses: thenCode *)

function thenCode(evp: boolean; s: statementp): statementp; external;
function thenCode;
 var st: statementp; n: nodep; v: varidefp;
 begin
 if s↑.stype = signaltype then st := s		(* treat signal specially *)
  else
   begin
   st := newStatement;
   with st↑ do			(* make a cmon to execute the code *)
    begin
    stype := cmtype;
    deferCm := false;
    exprCm := false;
    conclusion := s;
    appendEnd(st,s);
    n := newNode;
    oncond := n;
    end;
   v := makeNVar(cmontype,nil);	(* make a variable for the cmon *)
   v↑.s := st;
   st↑.cdef := v;
   if evp then		(* do we need to make an event variable? *)
     begin
     with n↑ do
      begin
      ntype := leafnode;
      ltype := varitype;
      vari := makeNVar(eventtype,nil);
      makeNewVar(vari);	(* if active block deal with environment entry *)
      vid := nil;
      end;
     end;
   makeNewVar(v);	(* if active block deal with environment entry *)
   end;
 thenCode := st;
 end;

(* waitParse *)

procedure waitParse(sp: statementp); external;
procedure waitParse;
 begin
 with sp↑ do
  begin
  event := checkArg(e3gExprParse,eventtype);
  exprs := nil;
  with event↑ do			(* make sure it's a variable *)
   if not (((ntype = leafnode) and (ltype = varitype)) or
	   ((ntype = exprnode) and (op = arefop))) then
     begin		(* no good *)
     pp20L(' Need an event varia',20); pp10('ble here  ',8); errprnt;
     relExpr(event);
     event := nil;
     end
    else
     if ntype <> leafnode then exprs := evalOrder(arg2,nil,true);
  end;
 end;

(* armMagicParse *)

procedure armMagicParse(sp: statementp); external;
procedure armMagicParse;
 var n,lexpr: nodep; b: boolean;
 begin
 with sp↑ do
  begin
  cmdnum := checkArg(e3gExprParse,svaltype);
  getDelim(',');
  dev := e3gExprParse;
  if dev = nil then b := true
   else
    with dev↑ do			(* make sure it's a variable *)
     begin
     b := (ntype <> leafnode) or (ltype <> varitype);
     if b then b := (ntype <> exprnode) or (op <> arefop);
     end;
  if b then
    begin
    pp20L(' Need a device varia',20); pp10('ble here  ',8); errprnt;
    bad := true;			(* mark statement as bad *)
    end
   else
    bad := false;			(* statement is ok *)
  getToken;
  backup := true;
  if (not endOfLine) or
     (curToken.ttype <> delimtype) or (curToken.ch <> ';') then getDelim(',');
  pnode↑.arg2 := nil;
  e3gGetArgs(pnode);			(* pretend we just saw a queryop *)
  iargs := pnode↑.arg2;			(* store away pointer to argument list *)
  getToken;
  backup := true;
  if (not endOfLine) or
     (curToken.ttype <> delimtype) or (curToken.ch <> ';') then getDelim(',');
  pnode↑.arg2 := nil;
  e3gGetArgs(pnode);			(* do it all again for results list *)
  oargs := pnode↑.arg2;
  n := oargs;
  b := false;
  while (n <> nil) and not b do
   begin		(* make sure each entry in result list is a variable *)
   with n↑.lval↑ do
    begin
    b := (ntype <> leafnode) or (ltype <> varitype);
    if b then b := (ntype <> exprnode) or (op <> arefop);
    end;
   n := n↑.next;
   end;
  if b then
    begin
    pp20L(' Can only have varia',20); pp10('bles here ',9); errprnt;
    bad := true;				(* mark statement as bad *)
    end;
  if not bad then
    begin					(* set up exprs field *)
    lexpr := evalOrder(cmdnum,nil,true);
    if dev <> nil then				(* evaluate device *)
     if dev↑.ntype <> leafnode then
       lexpr := evalOrder(dev↑.arg2,nil,true);	(* push array subscripts *)
    lexpr := evalOrder(iargs,lexpr,true);	(* push input arguments *)
    n := oargs;
    while n <> nil do
     with n↑ do
      begin				(* push any subscripts in result list *)
      if lval↑.ntype = exprnode then lexpr := evalOrder(n↑.lval,lexpr,true);
      n := next;
      end;
    exprs := lexpr;
    end;

  end;
 end;